package mylab.utils.common;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

import lombok.experimental.UtilityClass;

/**
 * Gson 工具类（线程安全）
 */
@UtilityClass
public class GsonUtil {

    // 默认 Gson 实例（基础配置）
    private final Gson DEFAULT_GSON = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss") // 默认日期格式
            .disableHtmlEscaping()                // 禁用 HTML 转义
            .create();

    // 自定义 Gson 实例（通过 getCustomGson() 配置）
    private Gson customGson;

    /**
     * 获取默认 Gson 实例
     */
    public Gson getGson() {
        return DEFAULT_GSON;
    }

    /**
     * 获取自定义配置的 Gson 实例
     */
    public Gson getCustomGson() {
        if (customGson == null) {
            synchronized (GsonUtil.class) {
                if (customGson == null) {
                    customGson = new GsonBuilder()
                            .setPrettyPrinting()       // 美化输出
                            .serializeNulls()          // 序列化 null 值
                            .excludeFieldsWithoutExposeAnnotation() // 忽略未标记 @Expose 的字段
                            .setDateFormat("yyyy-MM-dd")
                            .create();
                }
            }
        }
        return customGson;
    }

    // ---------- 序列化（对象 → JSON） ----------

    /**
     * 对象转 JSON 字符串（默认配置）
     */
    public String toJson(Object object) {
        return DEFAULT_GSON.toJson(object);
    }

    /**
     * 对象转 JSON 字符串（自定义配置）
     */
    public String toJsonCustom(Object object) {
        return getCustomGson().toJson(object);
    }

    // ---------- 反序列化（JSON → 对象） ----------

    /**
     * JSON 字符串转对象（默认配置）
     */
    public <T> T fromJson(String json, Class<T> clazz) {
        try {
            return DEFAULT_GSON.fromJson(json, clazz);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * JSON 字符串转对象（自定义配置）
     */
    public <T> T fromJsonCustom(String json, Class<T> clazz) {
        try {
            return getCustomGson().fromJson(json, clazz);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * JSON 字符串转泛型对象（如 List<T>、Map<K,V>）
     * 示例：List<User> list = GsonUtil.fromJson(json, new TypeToken<List<User>>() {});
     */
    public <T> T fromJson(String json, TypeToken<T> typeToken) {
        try {
            return DEFAULT_GSON.fromJson(json, typeToken.getType());
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    // ---------- 快捷方法 ----------

    /**
     * JSON 字符串转 List
     */
    public <T> List<T> toList(String json, Class<T> clazz) {
        Type type = TypeToken.getParameterized(List.class, clazz).getType();
        return DEFAULT_GSON.fromJson(json, type);
    }

    /**
     * JSON 字符串转 Map
     */
    public <K, V> Map<K, V> toMap(String json, Class<K> keyClass, Class<V> valueClass) {
        Type type = TypeToken.getParameterized(Map.class, keyClass, valueClass).getType();
        return DEFAULT_GSON.fromJson(json, type);
    }
}